import type { Sharp } from 'sharp';

export interface SharpOptions {
  /**
   * 图片质量配置
   */
  quality?: {
    jpeg?: number;
    png?: number;
    webp?: number;
    avif?: number;
  };

  /**
   * 压缩配置
   */
  compress?: {
    jpeg?: {
      quality?: number;
      progressive?: boolean;
      mozjpeg?: boolean;
      optimiseScans?: boolean;
      optimiseCoding?: boolean;
      quantisationTable?: number;
    };
    png?: {
      quality?: number;
      compressionLevel?: number;
      palette?: boolean;
      adaptiveFiltering?: boolean;
      colours?: number;
      dither?: number;
    };
    webp?: {
      quality?: number;
      effort?: number;
      lossless?: boolean;
      nearLossless?: boolean;
      smartSubsample?: boolean;
      preset?: 'default' | 'photo' | 'picture' | 'drawing' | 'icon' | 'text';
    };
    avif?: {
      quality?: number;
      effort?: number;
      chromaSubsampling?: '4:4:4' | '4:2:2' | '4:2:0';
      lossless?: boolean;
    };
  };

  /**
   * 格式转换配置
   * 兼容两种写法：
   * - 新：直接指定转换目标字符串：'webp' | 'avif'
   * - 旧：对象形式 { toWebP?: boolean; toAVIF?: boolean; fallback?: boolean }
   */
  convert?:
    | 'webp'
    | 'avif'
    | {
        /** 转换为 WebP 格式（旧写法） */
        toWebP?: boolean;
        /** 转换为 AVIF 格式（旧写法） */
        toAVIF?: boolean;
        /** 保留原格式作为回退（旧写法） */
        fallback?: boolean;
      };

  /**
   * 转换来源格式控制
   * 仅当源图片格式在该列表中时才执行到目标格式的转换。
   * 默认 ['jpeg', 'jpg', 'png']。
   */
  convertFrom?: ('png' | 'jpeg' | 'jpg')[];

  /**
   * 是否删除原始图片（等价于 convertMode: 'replace'）。
   * true 时，仅产出转换后的资源，不再保留原始图片。
   */
  deleteOriginal?: boolean;

  /**
   * 转换产出模式：
   * - 'sidecar'：旁路产出（保留原图并额外生成 webp/avif）
   * - 'replace'：替换原图（仅发射转换后的结果）
   * 默认根据 deleteOriginal 推断：true -> 'replace'，否则 'sidecar'
   */
  convertMode?: 'sidecar' | 'replace';

  /**
   * 响应式图片配置
   */
  responsive?: {
    /**
     * 生成的尺寸数组
     */
    sizes?: number[];
    /**
     * 输出格式
     */
    formats?: ('jpeg' | 'png' | 'webp' | 'avif')[];
    /**
     * 是否生成 srcset
     */
    generateSrcset?: boolean;
  };

  /**
   * 文件过滤配置
   */
  filter?: {
    /**
     * 最小文件大小（字节）
     */
    minSize?: number;
    /**
     * 最大文件大小（字节）
     */
    maxSize?: number;
    /**
     * 包含的文件扩展名
     */
    include?: string[];
    /**
     * 排除的文件扩展名
     */
    exclude?: string[];
    /**
     * 包含的路径模式
     */
    includePaths?: (string | RegExp)[];
    /**
     * 排除的路径模式
     */
    excludePaths?: (string | RegExp)[];
  };

  /**
   * 输出配置
   */
  output?: {
    /**
     * 输出目录
     */
    dir?: string;
    /**
     * 文件名模板
     */
    filename?: string;
    /**
     * 是否保留原文件
     */
    keepOriginal?: boolean;
  };

  /**
   * 性能配置
   */
  performance?: {
    /**
     * 并发处理数量
     */
    concurrency?: number;
    /**
     * 是否启用缓存
     */
    cache?: boolean;
    /**
     * 缓存目录
     */
    cacheDir?: string;
  };

  /**
   * 调试配置
   */
  debug?: boolean;
}

export interface ProcessedImage {
  originalPath: string;
  outputPath: string;
  originalSize: number;
  compressedSize: number;
  format: string;
  width?: number;
  height?: number;
}

export interface ProcessingStats {
  totalFiles: number;
  processedFiles: number;
  totalOriginalSize: number;
  totalCompressedSize: number;
  compressionRatio: number;
  processingTime: number;
}

export type SharpProcessor = (sharp: Sharp, options: SharpOptions) => Promise<Buffer>;
